package datastructure.sort_algorithm;

import java.util.Arrays;

/**
 * 希尔排序
 * 希尔排序是把记录按下标的一定增量分组，对每组使用直接插入排序算法排序；随着增量逐渐减少，每组包含的关键词越来越多，
 * 当增量减至 1 时，整个文件恰被分成一组，算法便终止
 * O(b log n)
 * @author lbw
 */
public class ShellsSorting {
    public static void main(String[] args) {
        int[] arr = new int[]{8, 9, 1, 7, 2, 3, 5, 4, 6, 0, -1};
        shellSort2(arr);
        System.out.println(Arrays.toString(arr));
    }

    /**
     * 交换法
     * @param arr
     */
    public static void shellSort(int[] arr){
        int temp = 0;
        for (int gap = arr.length/2; gap >=1; gap /= 2){
            for (int i = gap; i < arr.length; i++){
                for (int j = i-gap; j >= 0; j -= gap){
                    if (arr[j] > arr[j+gap]){
                        temp = arr[j];
                        arr[j] = arr[j+gap];
                        arr[j+gap] = temp;
                    }
                }
            }
        }
    }

    /**
     * 移位法
     * @param arr
     */
    public static void shellSort2(int[] arr){
        int temp = 0;
        for (int gap = arr.length/2; gap >=1; gap /= 2){
            for (int i = gap; i < arr.length; i++){
                temp = arr[i];
                int index = i;
                for (int j = i; j >= 0; j -= gap){
                    if (arr[j] > temp){
                        arr[index] = arr[j];
                        arr[j] = temp;
                        index -= gap;
                    }
                }
            }
        }
    }
}
